home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 4490 / 4490.xpi / chrome / wmn.jar / content / options.js < prev    next >
Text File  |  2010-01-14  |  21KB  |  620 lines

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3.  *
  4.  * The contents of this file are subject to the Mozilla Public License Version
  5.  * 1.1 (the "License"); you may not use this file except in compliance with
  6.  * the License. You may obtain a copy of the License at
  7.  * http://www.mozilla.org/MPL/
  8.  *
  9.  * Software distributed under the License is distributed on an "AS IS" basis,
  10.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11.  * for the specific language governing rights and limitations under the
  12.  * License.
  13.  *
  14.  * The Original Code is WebMail Notifier.
  15.  *
  16.  * The Initial Developer of the Original Code is
  17.  * Byungwook Kang.
  18.  * Portions created by the Initial Developer are Copyright (C) 2007
  19.  * the Initial Developer. All Rights Reserved.
  20.  *
  21.  * Contributor(s):
  22.  *
  23.  * Alternatively, the contents of this file may be used under the terms of
  24.  * either the GNU General Public License Version 2 or later (the "GPL"), or
  25.  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  26.  * in which case the provisions of the GPL or the LGPL are applicable instead
  27.  * of those above. If you wish to allow use of your version of this file only
  28.  * under the terms of either the GPL or the LGPL, and not to allow others to
  29.  * use your version of this file under the terms of the MPL, indicate your
  30.  * decision by deleting the provisions above and replace them with the notice
  31.  * and other provisions required by the GPL or the LGPL. If you do not delete
  32.  * the provisions above, a recipient may use your version of this file under
  33.  * the terms of any one of the MPL, the GPL or the LGPL.
  34.  *
  35.  * ***** END LICENSE BLOCK ***** */
  36.  
  37. const dout=Components.utils.reportError;
  38.  
  39. const Ci=Components.interfaces;
  40. const PM_URI="chrome://wmn/accounts/";
  41. const PREF_BRANCH="extensions.wmn.accounts.";
  42. var prefBranch;
  43. var prefService;
  44. var accountsChanged=false;
  45. var rebuildTree=false;
  46. var arDefault;
  47. var arAccounts;
  48. var arDeleted;
  49. var keyNum;
  50. var autoLogin;
  51. var wmn;
  52. var current;
  53.  
  54. function onLoad() {
  55.   if(!checkMasterPasswords()){
  56.     window.close();
  57.     return;
  58.   }
  59.   wmn = Components.classes["@mozilla.org/WebMailNotifier;1"]
  60.               .getService(Ci.nsIWebMailNotifier);
  61.   keyNum=0;
  62.   prefService = Components.classes["@mozilla.org/preferences-service;1"]
  63.                               .getService(Ci.nsIPrefService);
  64.   prefBranch = prefService.getBranch("");
  65.   prefBranch.QueryInterface(Ci.nsIPrefBranch2);
  66.  
  67.   
  68.   arAccounts=[];
  69.   arDeleted=[];
  70.   var obj=document.getElementById("wmn-hosts");
  71.   _loadDefault(obj);
  72.   obj.selectedIndex=0;
  73.   var n=wmn.getAccountsNumber();
  74.   for(var i=0;i<n;i++){
  75.     var ar=wmn.getAccountInfo({},i);
  76.     addItem(ar[0],ar[1],ar[2],false,false);
  77.   }
  78.   checkDefault();
  79.   autoLogin=wmn.getIntValue("autoLogin");
  80.   document.getElementById("autologin").checked=autoLogin;
  81.   
  82.   customizeAdvancedView();
  83.   onSelect(-1);
  84.   toggleKeepAlert();
  85.  
  86.   if(prefBranch.getBoolPref("extensions.wmn.clearPasswdAlert")){
  87.   var sanitize=false;
  88.   try{sanitize=prefBranch.getBoolPref("privacy.sanitize.sanitizeOnShutdown");}catch(e){}
  89.   var clearPass=null;
  90.   var clearPassPref="privacy.clearOnShutdown.passwords";
  91.   try{clearPass=prefBranch.getBoolPref(clearPassPref);}catch(e){}
  92.   if(clearPass==null){
  93.     clearPassPref="privacy.item.passwords";
  94.     try{clearPass=prefBranch.getBoolPref(clearPassPref);}catch(e){} //for fx 2 
  95.   }
  96.   
  97.   if(sanitize&&clearPass){
  98.     var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
  99.                             .getService(Components.interfaces.nsIPromptService);
  100.     var check = {value: prefBranch.getBoolPref("extensions.wmn.clearPasswdAlert")};
  101.     var res=prompts.confirmCheck(null, getString("clearPasswordAlertTitle"), getString("clearPasswordAlertText"),
  102.                      getString("clearPasswordAlertCheck"), check);
  103.     if(res){
  104.       prefBranch.setBoolPref(clearPassPref,false);    
  105.     }
  106.     prefBranch.setBoolPref("extensions.wmn.clearPasswdAlert",check.value);
  107.     }
  108.   }
  109. }
  110.  
  111. function onAccept() {
  112.   if(accountsChanged){
  113.     var prefService = Components.classes["@mozilla.org/preferences-service;1"]
  114.                               .getService(Components.interfaces.nsIPrefService);
  115.     for each(var o in arDeleted){//check deleted accounts;
  116.       wmn.removePassword(PM_URI+o.host,o.user);
  117.       var s=PREF_BRANCH+o.host+"."+o.user;
  118.       try{ prefBranch.deleteBranch(s); }catch(e){}
  119.     }
  120.     if(arDeleted)prefService.savePrefFile(null);
  121.   }
  122.   if(accountsChanged||rebuildTree){
  123.     for(var id in arDefault){//check default accounts
  124.       var str=PREF_BRANCH+id+".default";
  125.       var t=null;
  126.       try{
  127.         t=prefBranch.getCharPref(str);
  128.       }catch(e){}
  129.       if(t!=arDefault[id]){
  130.         if(arDefault[id])prefBranch.setCharPref(str,arDefault[id]);
  131.         else prefBranch.clearUserPref(str);
  132.       }
  133.     }
  134.     for each(var o in arAccounts){//check newly added accounts
  135.       _setBool(o.host,o.user,"enabled",o.enabled);    
  136.       _setBool(o.host,o.user,"inboxOnly",o.inboxOnly);
  137.       _setBool(o.host,o.user,"showFolders",o.showFolders);
  138.     }
  139.     if(accountsChanged){
  140.       for each(var o in arAccounts){
  141.         if(o.isNew){
  142.           wmn.setPassword(PM_URI+o.host,o.user,o.passwd);
  143.         }
  144.       }
  145.     }
  146.   }
  147.   var val=document.getElementById("autologin").checked?1:0;
  148.   if(val!=autoLogin){
  149.     var str="chrome://wmn/options";
  150.     var str2="autoLogin";
  151.     wmn.setIntValue(str2,val);
  152.     wmn.setPassword(str,str2,val);
  153.   }
  154.   if(accountsChanged||main.hostDeleted){
  155.     wmn.initHandlers(true);
  156.   }else if(rebuildTree){
  157.     wmn.buildTable(true);
  158.   }
  159.   return false;
  160. }
  161. function _setBool(host,user,name,val){
  162.   var prefStr=PREF_BRANCH+host+"."+user+"."+name;
  163.   var t=null;
  164.   try{
  165.     t=prefBranch.getBoolPref(prefStr);
  166.   }catch(e){}
  167.   if(t!=val){
  168.     prefBranch.setBoolPref(prefStr,val);
  169.   }
  170. }
  171. function onCancel(){
  172.   if((prefBranch.getBoolPref("browser.preferences.instantApply"))){//not window. close button only
  173.     onAccept();
  174.   }else if(main.hostDeleted){
  175.     wmn.initHandlers(true);
  176.   }
  177. }
  178. function _loadDefault(obj){
  179.   arDefault=[];
  180.   var ar=wmn.getHostIDs({});
  181.   for each(var id in ar){
  182.     var s=getHostName(id);
  183.     if(s==null)continue;
  184.     if(obj)obj.appendItem(s,id);
  185.     try{
  186.       arDefault[id]=prefBranch.getCharPref(PREF_BRANCH+id+".default");
  187.     }catch(e){}
  188.   }
  189. }
  190. function getHostName(host){
  191.   try{
  192.     return this.getString(host);
  193.   }catch(e){}
  194.   var t=wmn.getHostName(host);
  195.   return t;
  196. }
  197. function addItem(host,user,passwd,isNew,byUser){
  198.   var key=keyNum++;
  199.   var prefStr=PREF_BRANCH+host+"."+user+".enabled";
  200.   var enabled=true;
  201.   var inboxOnly=true;
  202.   var showFolders=true;
  203.   if(isNew&&byUser){//user input
  204.     inboxOnly=document.getElementById("inbox-only").checked;
  205.     showFolders=document.getElementById("show-folders").checked;
  206.   }else{
  207.     try{
  208.       enabled=prefBranch.getBoolPref(prefStr);
  209.     }catch(e){}
  210.     try{
  211.       inboxOnly=prefBranch.getBoolPref(PREF_BRANCH+host+"."+user+".inboxOnly");
  212.     }catch(e){}
  213.     try{
  214.       showFolders=prefBranch.getBoolPref(PREF_BRANCH+host+"."+user+".showFolders");
  215.     }catch(e){}  
  216.   }
  217.   arAccounts.push({"host":host,"user":user,"passwd":passwd,"enabled":enabled,
  218.                 "inboxOnly":inboxOnly,"showFolders":showFolders,"key":key,"isNew":isNew});
  219.  
  220.   var obj = document.createElement("listitem");
  221.   obj.setAttribute("allowevents","true");
  222.     var ch = document.createElement("listcell");
  223.       var ch1 = document.createElement("vbox");
  224.       ch1.setAttribute("flex","1");
  225.       ch1.setAttribute("align","center");
  226.         var ch2 = document.createElement("checkbox");
  227.         ch2.setAttribute("checked",enabled);
  228.         ch2.setAttribute("onclick","setEnabled(this.checked,"+key+")");
  229.         ch1.appendChild(ch2);
  230.       ch.appendChild(ch1);
  231.     obj.appendChild(ch);
  232.     ch = document.createElement("listcell");
  233.     ch.setAttribute("label",this.getHostName(host));
  234.     obj.appendChild(ch);
  235.     ch = document.createElement("listcell");
  236.     ch.setAttribute("label",user);
  237.     obj.appendChild(ch);
  238.     ch = document.createElement("listcell");
  239.       var ch1 = document.createElement("vbox");
  240.       ch1.setAttribute("flex","1");
  241.       ch1.setAttribute("align","center");
  242.         var ch2 = document.createElement("checkbox");
  243.         ch2.setAttribute("id","is-default"+key);
  244.         ch2.setAttribute("onclick","setDefault("+key+")");
  245.         ch1.appendChild(ch2);
  246.       ch.appendChild(ch1);
  247.     obj.appendChild(ch);
  248.   document.getElementById("wmn-accounts").appendChild(obj);
  249. }
  250. function getAccount(aKey){
  251.   for each(var o in arAccounts){
  252.     if(o.key==aKey)return o;
  253.   }
  254.   return null;
  255. }
  256. function setDefault(aKey){
  257.   var o=getAccount(aKey);
  258.   if(!o.enabled||arDefault[o.host]==o.user)return;
  259.   arDefault[o.host]=o.user;
  260.   checkDefault();
  261.   rebuildTree=true;
  262. }
  263. function setEnabled(disable,aKey){
  264.   var o=getAccount(aKey);
  265.   o.enabled=!disable;
  266.   if(disable){
  267.     if(arDefault[o.host]==o.user)arDefault[o.host]=null;
  268.   }
  269.   checkDefault();
  270.   rebuildTree=true;
  271. }
  272.  
  273. function checkDefault(){
  274.   for each(var o in arAccounts){
  275.     var em=document.getElementById("is-default"+o.key);
  276.     if(o.enabled){
  277.       if(!arDefault[o.host])arDefault[o.host]=o.user;
  278.       var val=o.user==arDefault[o.host];
  279.       em.setAttribute("checked",val);
  280.       em.setAttribute("disabled",val);
  281.     }else{
  282.       em.setAttribute("checked",false);
  283.       em.setAttribute("disabled",true);
  284.     }
  285.   }
  286. }
  287. function onSelect(aIndex){
  288.   if(aIndex<0){
  289.     document.getElementById("username").value="";
  290.     document.getElementById("password").value="";
  291.     document.getElementById("server").value="";
  292.     document.getElementById("inbox-only").checked=true;
  293.     document.getElementById("show-folders").checked=true;
  294.     current=null;
  295.     setAddMode(true);    
  296.   }else{
  297.     var o=arAccounts[aIndex];
  298.     document.getElementById("wmn-hosts").value=o.host;
  299.     if(o.user.indexOf("|")!=-1){
  300.       var ar=o.user.split("|");
  301.       document.getElementById("username").value=ar[0];
  302.       document.getElementById("server").value=ar[1];
  303.     }else{
  304.       document.getElementById("username").value=o.user;
  305.       document.getElementById("server").value="";
  306.     }    
  307.     document.getElementById("password").value=o.passwd;
  308.     document.getElementById("inbox-only").checked=o.inboxOnly;
  309.     document.getElementById("show-folders").checked=o.showFolders;
  310.     current=o;
  311.     setAddMode(false);    
  312.   }
  313.   customizeAdvancedView();
  314. }
  315. function getString(aName) {
  316.   var strbundle = document.getElementById("wmn-strings");
  317.   return strbundle.getString(aName);
  318. }
  319. function onAdd(){
  320.   var user=document.getElementById("username").value;
  321.   if(!user)return;
  322.   var server=document.getElementById("server").value;
  323.   if(server)user+="|"+server;
  324.   var passwd=document.getElementById("password").value;
  325.   var host=document.getElementById("wmn-hosts").value;
  326.   user=_addAcount(host,user,passwd,true);
  327.   if(user.indexOf("|")!=-1)user=user.substring(0,user.indexOf("|"));
  328.   document.getElementById("username").value=user;
  329.   checkIsNew();
  330. }
  331. function getIndex(host,user){
  332.   user=getFullUsername(host,user);
  333.   var o;
  334.   for(var i in arAccounts){
  335.     o=arAccounts[i];
  336.     if(o.host==host&&o.user==user){
  337.       return i;
  338.       break;
  339.     }
  340.   }
  341.   return -1;
  342. }
  343. function getFullUsername(host,user){
  344.   var server;
  345.   if(user.indexOf("|")!=-1){
  346.     var ar=user.split("|");
  347.     user=ar[0];
  348.     server=ar[1];
  349.   }
  350.   var hostStr=wmn.getScriptVal(host,"hostString");
  351.   if(hostStr&&user.indexOf("@")==-1){
  352.     user=user+"@"+hostStr;
  353.   }else if((hostStr=="")&&user.indexOf("@")!=-1){
  354.     user=user.substring(0,user.indexOf("@"));
  355.   }
  356.   if(server)return user+"|"+server;
  357.   else return user;
  358. }
  359. function _addAcount(host,user,passwd,byUser){
  360.   user=getFullUsername(host,user);
  361.   var i=getIndex(host,user);
  362.   if(i<0){//new account
  363.     addItem(host,user,passwd,true,byUser);
  364.     checkDefault();
  365.   }else{//account exists.
  366.     var inboxOnly=document.getElementById("inbox-only").checked;
  367.     var showFolders=document.getElementById("show-folders").checked; 
  368.     var o=arAccounts[i];
  369.     if(o.passwd==passwd&&o.inboxOnly==inboxOnly&&o.showFolders==showFolders)return;
  370.     o.passwd=passwd;
  371.     o.inboxOnly=inboxOnly;
  372.     o.showFolders=showFolders;
  373.     o.isNew=true;
  374.   }
  375.   accountsChanged=true;
  376.   return user;
  377. }
  378. function setValue(name,val){
  379.   if(current){
  380.     current[name]=val;
  381.     current.isNew=true;
  382.     accountsChanged=true;    
  383.   }
  384. }
  385. function onDelete(){
  386.   var obj=document.getElementById("wmn-accounts");
  387.   var index=obj.selectedIndex;
  388.   if(index<0)return;
  389.   var o=arAccounts[index];
  390.   arDeleted.push(o);
  391.   obj.removeItemAt(index);
  392.   arAccounts.splice(index,1);
  393.   if(arDefault[o.host]==o.user){
  394.     arDefault[o.host]=null;
  395.     checkDefault();
  396.   }
  397.   accountsChanged=true;
  398. }
  399. function onImport(){
  400.   var fp = Components.classes["@mozilla.org/filepicker;1"]
  401.                  .createInstance(Ci.nsIFilePicker);
  402.   fp.init(window, "Import",Ci.nsIFilePicker.modeOpen);
  403.   fp.appendFilter ("WebMail Notifier data","*.wmn");
  404.   fp.appendFilters(Ci.nsIFilePicker.filterAll);
  405.   var rv = fp.show();
  406.   if (rv == Ci.nsIFilePicker.returnOK)
  407.   {
  408.     var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
  409.                           .getService(Components.interfaces.nsIPromptService);
  410.     var param = {value: null};
  411.     var result = prompts.promptPassword(null, getString("exportPromptTitle"), getString("exportPromptText"),param,null,{});
  412.     if(!param.value)return;
  413.  
  414.     var file=fp.file;
  415.     var str=wmn.loadFile0(file);
  416.  
  417.     var re=/\[---(.+?)---\]\r\n([\s\S]+?)\r\n(?=\[--)/g;
  418.     var o;
  419.     while ((o = re.exec(str)) != null){
  420.       if(o[1]=="<info>"){
  421.         var p=AesCtr.decrypt(o[2],param.value,256);
  422.         if(p!=p.match(/\d+/)){
  423.           prompts.alert(null, getString("exportPromptTitle"), getString("importWrongPassword"));
  424.           return;
  425.         }
  426.       }else if(o[1]=="<accounts>"){
  427.         var ar=o[2].split("\r\n");
  428.         for each(var t in ar){
  429.           t=AesCtr.decrypt(t,param.value,256);
  430.           var ac=t.split("\t");
  431.           _addAcount(ac[0],ac[1],ac[2]);
  432.         }
  433.       }else if(o[1]=="<preferences>"){
  434.         var ar=o[2].split("\r\n");
  435.         for each(var t in ar){
  436.           var val=t.split("\t");
  437.           switch(parseInt(val[1])){
  438.           case 0:
  439.             prefBranch.setCharPref(val[0],val[2]);
  440.             break;
  441.           case 1:
  442.             prefBranch.setIntPref(val[0],val[2]);
  443.             break;
  444.           case 2:
  445.             prefBranch.setBoolPref(val[0],val[2]=="true");
  446.             break;
  447.           }
  448.         }
  449.         prefService.savePrefFile(null);
  450.         _loadDefault();
  451.       }else{
  452.         main.addScript(o[1],o[2]);
  453.       }
  454.     }
  455.   }
  456. }
  457. function onExport(){
  458.   var fp = Components.classes["@mozilla.org/filepicker;1"]
  459.                  .createInstance(Ci.nsIFilePicker);
  460.   fp.init(window, "Export",Ci.nsIFilePicker.modeSave);
  461.   fp.defaultString="wmndata.wmn";
  462.   fp.defaultExtension="wmn";
  463.   fp.appendFilter ("WebMail Notifier data","*.wmn");
  464.   fp.appendFilters(Ci.nsIFilePicker.filterAll);
  465.   var rv = fp.show();
  466.   if (rv == Ci.nsIFilePicker.returnOK||rv == Ci.nsIFilePicker.returnReplace)
  467.   {
  468.     var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
  469.                           .getService(Components.interfaces.nsIPromptService);
  470.     var param = {value: null};
  471.     var result = prompts.promptPassword(null, getString("exportPromptTitle"), getString("exportPromptText"),param,null,{});
  472.     if(!param.value)return;
  473.  
  474.     var file=fp.file;
  475.     var str="[---<info>---]\r\n";
  476.     var token=Math.random().toString().substring(2);
  477.     str+=AesCtr.encrypt(token,param.value,256)+"\r\n";
  478.     var ar=wmn.getScriptList({});
  479.     for each(var o in ar){
  480.       str+="[---"+o+"---]\r\n";
  481.       str+=wmn.loadFile("wmn/"+o+".js")+"\r\n";
  482.     }
  483.  
  484.     str+="[---<preferences>---]\r\n";
  485.     var ar=prefBranch.getChildList("extensions.wmn.",{});
  486.     for each(var o in ar){
  487.       if(o.indexOf("extensions.wmn.webmail")==0)continue;
  488.       var type=prefBranch.getPrefType(o);
  489.       switch(type){
  490.       case Ci.nsIPrefBranch.PREF_STRING:
  491.         str+=o+"\t0\t"+prefBranch.getCharPref(o)+"\r\n";
  492.         break;
  493.       case Ci.nsIPrefBranch.PREF_INT:
  494.         str+=o+"\t1\t"+prefBranch.getIntPref(o)+"\r\n";
  495.         break;
  496.       case Ci.nsIPrefBranch.PREF_BOOL:
  497.         str+=o+"\t2\t"+prefBranch.getBoolPref(o)+"\r\n";
  498.         break;
  499.       }
  500.     }
  501.     str+="[---<accounts>---]\r\n";
  502.     for each(var o in arAccounts){
  503.       str+=AesCtr.encrypt(o.host+"\t"+o.user+"\t"+o.passwd+"\t"+token,param.value,256)+"\r\n";
  504.     }
  505.     str+="[------]";
  506.     wmn.saveFile0(file,str);
  507.   }
  508. }
  509. function checkIsNew(){
  510.   var user=document.getElementById("username").value;
  511.   if(!user){
  512.     current=null;
  513.     return;
  514.   }
  515.   var host=document.getElementById("wmn-hosts").value;
  516.   var server=document.getElementById("server").value;
  517.   if(server)user+="|"+server;
  518.   var n=getIndex(host,user);
  519.   current=n<0?null:arAccounts[n];
  520.   setAddMode(n<0);
  521. }
  522. function setAddMode(isNew){
  523.   document.getElementById("btn-add").disabled=!isNew;
  524.   document.getElementById("btn-delete").disabled=isNew;
  525. }
  526. function customizeAdvancedView(){
  527.     var host=document.getElementById("wmn-hosts").value;
  528.     var isGmail=(host=="gmail");
  529.     document.getElementById("inbox-only").disabled=!wmn.getScriptVal(host,"supportInboxOnly");
  530.     document.getElementById("show-folders").disabled=!wmn.getScriptVal(host,"supportShowFolders");
  531.     document.getElementById("show-folders").label=document.getElementById(isGmail?"lb-show-labels":"lb-show-folders").value;
  532.     document.getElementById("yahoo").collapsed=host!="yahoo";
  533.     document.getElementById("server-box").collapsed=!wmn.getScriptVal(host,"needServer");
  534. }
  535. function toggleKeepAlert(){
  536.   document.getElementById("keep-alert").disabled=!document.getElementById("show-alert").checked;
  537. }
  538. function showAdvancedSound(){
  539.   document.documentElement
  540.           .openSubDialog("chrome://wmn/content/notifications.xul",
  541.                           "", null);
  542. }
  543.  
  544. function checkMasterPasswords() {
  545.   var tokendb = Components.classes["@mozilla.org/security/pk11tokendb;1"]
  546.                     .createInstance(Ci.nsIPK11TokenDB);
  547.   var token = tokendb.getInternalKeyToken();
  548.  
  549.   // There is no master password
  550.   if (token.checkPassword(""))return true;
  551.  
  552.   // So there's a master password. But since checkPassword didn't succeed, we're logged out (per nsIPK11Token.idl).
  553.   try {
  554.     // Relogin and ask for the master password.
  555.     token.login(true);  // 'true' means always prompt for token password. User will be prompted until
  556.                         // clicking 'Cancel' or entering the correct password.
  557.   } catch (e) {
  558.     // An exception will be thrown if the user cancels the login prompt dialog.
  559.     // User is also logged out of Software Security Device.
  560.   }
  561.   return token.isLoggedIn();
  562. }
  563. var main={
  564.   hostDeleted:false,
  565.   addHost:function(hostID,inList,needReload){
  566.     if(needReload)accountsChanged=true;//do reload
  567.     if(!inList){
  568.       var s=getHostName(hostID);
  569.       if(s!=null){
  570.         var obj=document.getElementById("wmn-hosts");
  571.         obj.appendItem(s,hostID);
  572.       }
  573.     }
  574.   },
  575.   removeHost:function(hostID){
  576.     delete arDefault[hostID];
  577.     var em=document.getElementById("wmn-hosts");
  578.     var list=em.firstChild.childNodes;
  579.     for(var i=0;i<list.length;i++){
  580.       var o=list[i];
  581.       if(o.getAttribute("value")==hostID){
  582.         em.removeItemAt(i);
  583.         em.selectedIndex=0;
  584.         break;
  585.       }
  586.     }
  587.     var obj=document.getElementById("wmn-accounts");
  588.     for(var i=0;i<arAccounts.length;i++){
  589.       var o=arAccounts[i];
  590.       if(o.host==hostID){
  591.         obj.removeItemAt(i);
  592.         arAccounts.splice(i,1);
  593.         --i;
  594.         this.hostDeleted=true;
  595.       }
  596.     }
  597.     for(var i=0;i<arDeleted.length;i++){//check arDeleted also.
  598.       var o=arDeleted[i];
  599.       if(o.host==hostID){
  600.         arDeleted.splice(i,1);
  601.         --i;
  602.         this.hostDeleted=true;
  603.       }
  604.     }
  605.   },
  606.   showScripts:function(){
  607.     document.documentElement
  608.             .openSubDialog("chrome://wmn/content/pref-script.xul",
  609.                             "", this);
  610.   },
  611.   addScript:function(fname,str){
  612.     var isInstalled=wmn.isInstalled(fname);
  613.     wmn.saveFile("wmn/"+fname+".js",str);
  614.     var needReload=wmn.addScript(fname);
  615.     if(fname.indexOf("lib-")!=0){
  616.       this.addHost(fname,isInstalled,needReload);
  617.     }
  618.     return isInstalled;
  619.   }
  620. }